Day 15:
1.整數類型
int64 c;
uint8 b;
uint248 e;
int256 constant a = 8;
對於 int and uint 可以自行設定佔用空間大小,佔用大小範圍 8 ~ 256,以8個
位元為一個單位 .
uint一般用來做為貨幣數量的類型(Solidity中沒有double 和 float)和日期
( unix time ),所以在Solidity中 7/2 = 3 ,小數部份不會顯示出來.
// 貨幣表示
uint balance = 1 ether;
// 時間表示
uint now = 1 hours;
// 不支持 float and double
uint x = 7;
uint y = 2;
uint z = x/y; //z = 3;
// 十六進制整數表示
uint VERSION_ID = 0x123A1;
// 宣告整數常數 使用 constant 常數關鍵字
int constant a = 8; // 一旦初始化後就不可以修改
/* SOlidity 中沒有內置隨機函數, 必須使用合約建構隨機數功能 */
Example :
pragma solidity ^0.4.8;
contract random{
function rand(uint min, uint max) public returns (uint){
uint256 lastBlockNumber = block.number - 1;
uint256 hashVal = uint256(block.blockhash(lastBlockNumber));
return hashVal%(min+max) - min;
}
}
// Bool 型態 取值為 true or false
bool b = true; or var b = true; //類型推斷
2.地址,Address
// 以太坊中的地址為 160 bit , 20 Byte , 所以可以用 uint160 表示
address public owner;
(1). 查看餘額
owner.balance;
(2). 發送以太幣有兩種方法 :
- transfer 從合約發起方,向某個地址轉入以太幣,當地址無效或餘額發起方不足時transfer
將拋出異常。
// 向 addressA 轉了一個以太幣
addressA.transfer(1 ether);
// or 附帶 Gas
addressA.transfer.gas(12000)(1 ether);
- send 是 transfer 的簡單版本. 當合約執行失敗時, send會返回false
owner.send(SOME_BALANCE); // 失敗時返回 false
使用send時有以下三點需要注意 :
(1). send函數需要包含在 if 中 , 因為在呼叫 send 函數時 , 合約可能會有函數
執行,這些函數可能會執行失敗 .
(2). 在用 send函數發送以太幣之前 , 請先執行減少帳戶餘額的操作 , 因為可能
會有Recursive call 消耗完餘額的風險.
(3). 用戶可以重載 send函數
Example:
if(owner.send(SOME_BALANCE)){}
x.transfer(y) == if(!x.send(y))throw; , send 是 transfer的底層實現,
建議盡可能使用transfer。
3.位元組陣列
(1).固定(位元組)陣列
固定陣列是以bytes加上數字後綴的方式定義,例如bytes2表示2個位元組大
小的陣列。
位元組可以設定 1 ~ 32 ,最小的遞增單位是 1,例如: bytes1 , bytes2 ,
bytes3 , ....bytes31 , bytes32。byte默認為bytes1。
Example :
byte a; /* 等於 bytes1 a */
bytes2 b; /* 宣告佔據2個位元的Array */
bytes32 c; /* 宣告佔據32個位元的Array */
(2). 動態(位元組)陣列
● bytes
bytes類似byte[],當bytes作為參數時,會自動為傳進的數值配置適合的位元
組大小
以節省記憶體,所以應該盡量使用bytes。
●string (以 UTF-8 格式編碼 )
類似於bytes,不提供指定索引的訪問方式。
Example:
string n = "hello"; /* 字串首與字串尾需要加上雙引號 */
n.length; /* 宣告的字串長度 */